#include "Salida.h"

Salida::Salida(int id, long numeroEstacionamiento) {
	this->id = id;
	this->numeroEstacionamiento = numeroEstacionamiento;
	this->salidaDeAutos = new Cola<autoSerializable>(
			Utils::NOMBRE_ARCHIVO_SALIDA, 'A');
	this->procesoGeneral = new Cola<mensaje>(
			Utils::NOMBRE_ARCHIVO_COLA_PROCESO_PRINCIPAL, 'A');
	this->simulacionHandler = new SimulacionHandler();
	SignalHandler::getInstance()->registrarHandler(SIGINT,
			this->simulacionHandler);
	lock = new LockFile((char *) Utils::NOMBRE_ARCHIVO_PARA_LOG);
	string mensaje = "Se crea salida : " + to_string(id)
			+ " para estacionamiento : " + to_string(numeroEstacionamiento)
			+ "\n";
	char* log = (char*) mensaje.c_str();
	lock->escribirConLock(log, strlen(log));
}

void Salida::iniciar() {
	bool terminar = false;
	while (!terminar) {
		autoSerializable autoSerializable;
		int resultado = this->salidaDeAutos->leer(
				this->numeroEstacionamiento + 1, &autoSerializable);
		if (resultado == -1) {
			cout << "Error al leer en Salida: " << this->getId() << endl;
		} else {
			if (autoSerializable.tipoMensaje == TIPO_MENSAJE_FIN) {
				terminar = true;
			} else {
				mensaje mensaje;
				mensaje.mtype = MTYPE_PROCESO_GENERAL;
				mensaje.tipoMensaje = 2;
				mensaje.mtypeProximo = getppid();
				mensaje.numeroEstacionamiento = this->numeroEstacionamiento;
				mensaje.posicionOcupada = autoSerializable.posicionOcupada;
				mensaje.tiempoEnElEstacionamiento =
						autoSerializable.tiempoEnElEstacionamiento;

				this->procesoGeneral->escribir(mensaje);
			}
		}
	}
	string mensaje = "La salida : " + to_string(id) + " para estacionamiento : "
			+ to_string(numeroEstacionamiento) + " finaliza\n";
	char* log = (char*) mensaje.c_str();
	lock->escribirConLock(log, strlen(log));
}

int Salida::getId() {
	return this->id;
}

Salida::~Salida() {
	delete this->salidaDeAutos;
	delete this->procesoGeneral;
	delete this->simulacionHandler;
}
